package com.wzy.responsibchain;

/**
 * @Auther: wzy
 * @Date: 2021/12/09/21:19
 * @Description: 模式的应用场景:
 * 1. 有多个对象可以处理一个请求，哪个对象处理该请求由运行时刻自动确定。
 * 2. 可动态指定一组对象处理请求，或添加新的处理者。
 * 3. 在不明确指定请求处理者的情况下，向多个处理者中的一个提交请求。
 * 拓展：
 * 职责链模式存在以下两种情况：
 * 1. 纯的职责链模式：一个请求必须被某一个处理者对象所接收，且一个具体处理者对某个请求的处理只能采用以下两种行为之一：自己处理（承担责任）；把责任推给下家处理。
 * 2. 不纯的职责链模式：允许出现某一个具体处理者对象在承担了请求的一部分责任后又将剩余的责任传给下家的情况，且一个请求可以最终不被任何接收端对象所接收
 */
public class Client {
    public static void main(String[] args) {
        // 班主任
        Leader classAdviser = new ClassAdviser();
        // 系主任
        Leader departmentHead = new DepartmentHead();
        // 学院院长
        Leader dean = new Dean();
        // 学生处
        Leader studentUnion = new StudentUnion();
        // 设置责任链  下一个责任人
        classAdviser.setNext(departmentHead);
        departmentHead.setNext(dean);
        dean.setNext(studentUnion);
        classAdviser.handleRequest(35);

    }

}

//抽象处理者：领导类
abstract class Leader {
    private Leader next;

    public void setNext(Leader next) {
        this.next = next;
    }

    public Leader getNext() {
        return next;
    }

    //处理请求的方法
    public abstract void handleRequest(int LeaveDays);
}

//具体处理者1：班主任类
class ClassAdviser extends Leader {
    @Override
    public void handleRequest(int LeaveDays) {
        if (LeaveDays <= 2) {
            System.out.println("班主任批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多，没有人批准该假条！");
            }
        }
    }
}

//具体处理者2：系主任类
class DepartmentHead extends Leader {
    @Override
    public void handleRequest(int LeaveDays) {
        if (LeaveDays <= 7) {
            System.out.println("系主任批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多，没有人批准该假条！");
            }
        }
    }
}

//具体处理者3：院长类
class Dean extends Leader {
    @Override
    public void handleRequest(int LeaveDays) {
        if (LeaveDays <= 10) {
            System.out.println("院长批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多，没有人批准该假条！");
            }
        }
    }
}

//具体处理者4：教务处长类
class DeanOfStudies extends Leader {
    @Override
    public void handleRequest(int LeaveDays) {
        if (LeaveDays <= 20) {
            System.out.println("教务处长批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多，没有人批准该假条！");
            }
        }
    }
}

//新增学生处为学生兜底
class StudentUnion extends Leader {
    @Override
    public void handleRequest(int LeaveDays) {
        if (LeaveDays < 30) {
            System.out.println("学生处给你批假");
        } else {
            if (this.getNext() != null) {
                this.getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("时间太长，无法批假！！");
            }
        }
    }
}
